package cn.wolfcode.wolf2w.util;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.lang.reflect.Method;
import java.util.List;

/**
 * 分页和更新的抽取
 */
public class DBHelper {
    // 静态方法

    // 分页  Class<T> clz 传入的是 类.class（字节码对象）
    public static <T> Page<T> query(MongoTemplate mongoTemplate, Query query, Class<T> clz, Pageable pageable){
        // total
        long total = mongoTemplate.count(query, clz);
        if (total == 0) {
            return Page.empty();
        }
        //  不要忘了将分页的添加到 条件对象当中
        query.with(pageable);
        // list
        List<T> list = mongoTemplate.find(query, clz);
        return new PageImpl<>(list,pageable,total);
    }

    // 更新  Object source（传入对象）
    public static void update(MongoTemplate mongoTemplate, Query query,Object source,String ... fields) {
        Update update = new Update();
        // 获取字节码对象
        Class<?> clz = source.getClass();
        // 遍历所有的字段，通过字节码对象获取该字段的方法并调用该方法
        for (String field : fields) {
            try {
                Method method = clz.getMethod("get" + field.substring(0, 1).toUpperCase() + field.substring(1));
                Object o = method.invoke(source);
                update.set(field, o);
            } catch (Exception e) {
                e.printStackTrace();
            }
            // update.set("ishot",hot);
            mongoTemplate.updateMulti(query, update, clz);
        }
    }
}
